package com.tedu.api.io;

import org.junit.Test;

import java.io.*;

/**
 * IO流--传对象--高级里
 * ObjectOutputStream 对象输出流--传Person.java对象--写操作
 * ObjectInputStream 对象输入流--传Person.java对象---读操作
 */
public class ObjectIO {
    /**
     * ObjectOutputStream 对象输出流
     * 使用方式：1.创建实现序列化接口的对象
     *         2.
     */
    @Test
    public void testOOS() throws IOException {
        //1.创建Person对象
       Person p=new Person();
        p.setName("韩美娟");
        //  数组--动态数组
        //  String[]  str={"1","2","3"}
        //
       p.setSay(new String[]{"百音必有果"});
        System.out.println("打印对象："+p);
        //对象写出文件  xxx.obj Person.java
        ObjectOutputStream oos= null;
        FileOutputStream fos=null;
        oos = null;
        try {

            fos= new FileOutputStream("person.obj");
            oos=new ObjectOutputStream(fos);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            oos.close();
            fos.close();
        }
        /**
         * writeObject(Object obj)  -------理解：写出对象
         * 该方法将会给定对象按照器结构进行转换
         * 转换为一组组字节，在通过其处理的流写出
         *
         *
         *
         * 写文件专业术语
         * 1.通过对象传输流将Person类，先转换为一组组字节，
         *   这个过程【对象序列化】
         * 2.将序列化的字节在通过字节流【低级流】写入文件中
         *  【硬盘上】做长久保存，这个过程【数据持久化】
         *  将person.obj持久化保存硬盘上
         */
        oos.writeObject(p);
        System.out.println("写出成功了~~");

    }
    /**
     * ObjectInputStream 对象输入流
     * 序列化：将对象转换为二进制
     * 反序列化：二进制转换为对象
     * readObject() 返回读取的对象【？】
     * 需求：将序列化person.obj 文件 按照对象方式读入
     */
    @Test
    public void testOIS() throws IOException, ClassNotFoundException {
        FileInputStream fis=null;
        //创建低价流
        ObjectInputStream ois= null;
        try {
            fis = new FileInputStream("person.obj");
                //创建高级流---对象读入
                ois = new ObjectInputStream(fis);

            //readObject() 获取对象【反序列化：二进制转换为对象】
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            ois.close();
            fis.close();
        }
        System.out.println(ois.readObject());
        System.out.println("反序列化成功了");
    }
}
